home *** CD-ROM | disk | FTP | other *** search
/ The Best of Down Under Games / The Best of Down Under Games.iso / 3dfx Screen Savers / Impact / IMPSRC.ZIP / THINGS.CPP < prev    next >
C/C++ Source or Header  |  1997-07-22  |  51KB  |  1,762 lines

  1. #include "winstuff.h"
  2. #include "things.h"
  3. #include <stdio.h>
  4. #include "dmouse.h"
  5. #include "myjoy.h"
  6. #include "math.h"
  7. #include "trigs.h"
  8. #include "land.h"
  9. //Matrix rotx, roty, rotz, rotc, rote, roto, tranm;
  10. float Camx,Camy,Camz,Camzoomx,Camzoomy;
  11. int TryCount,OldTryCount,AttCount,AttOld,frameCount;
  12. char MyS[256];
  13. float wWidth, wHeight,worker,wHWidth,wHHeight,GDx,GDy;
  14. float gfov;
  15. float aspect;
  16. int joynum=0;
  17. int dist = 8*1024;
  18. double Nextshot = 0;
  19. entity_t *Self, *Other,*Head,*Tail;
  20. void entity_t::LoadLWO(char *mlwo){
  21.     //Print(mlwo);
  22.     FILE *lwo;
  23.     short nada,leng,num,corn;
  24.     int tmp,tmp2,tmp3;
  25.     //int tmp
  26.     float pnt;
  27.     long posi,size;
  28.     char String[1024];
  29.     unsigned char J[3]={0,0,0};
  30.  
  31.  
  32.     size = filesize(mlwo);
  33.     lwo = fopen(mlwo, "rb");
  34.     if(!lwo) {
  35.         sprintf(MyS,"..\\system\\%s",mlwo);
  36.         size = filesize(MyS);
  37.         lwo = fopen(MyS, "rb");
  38.         if(!lwo)
  39.             return;
  40.     }
  41.  
  42.  
  43.     lwon = new char[strlen(mlwo)+1];
  44.     entity_t *Find = Head;
  45.     //Print("Finding");
  46.     while(Find){
  47.  
  48.         //Print(Find->lwon);
  49.         //Print(mlwo);
  50.         if(Find->lwon && !strcmpi(Find->lwon,mlwo)){
  51.             break;
  52.         }
  53.         Find=Find->next;
  54.         if(Tail == Head)
  55.             Find = 0;
  56.     }
  57.     //Print("Found done");
  58.     if(Find){
  59.         //Print("found");
  60.         strcpy(lwon,mlwo);
  61.         NumVerts = Find->NumVerts;
  62.         /*Verts = Find->Verts;
  63.         NumTris = Find->NumTris;
  64.         Tris = Find->Tris;
  65.         NumSurfs = Find->NumSurfs;
  66.         Surfs = Find->Surfs;*/
  67.         Verts = new GrVertex[NumVerts];
  68.         if(!Verts) Print("NoVerts!");
  69.         lit = new light_t[NumVerts];
  70.         if(!lit) Print("NoLit!");
  71.         memcpy(Verts,Find->Verts,sizeof(GrVertex)*NumVerts);
  72.         NumTris = Find->NumTris;
  73.         Tris = new faces_t[NumTris];
  74.         if(!Tris) Print("NoTris!");
  75.         memcpy(Tris,Find->Tris,sizeof(faces_t)*NumTris);
  76.  
  77.         for(tmp = 0;tmp<NumTris;tmp++){
  78.             //Tris[tmp].NumSides = Find->Tris[tmp].NumSides;
  79.             Tris[tmp].ndx = new int[Tris[tmp].NumSides];
  80.             if(!Tris[tmp].ndx) Print("No index!");
  81.  
  82.             memcpy(Tris[tmp].ndx,Find->Tris[tmp].ndx,sizeof(int)*Tris[tmp].NumSides);
  83.         }
  84.  
  85.  
  86.         NumSurfs = Find->NumSurfs;
  87.         //sprintf(MyS,"%i",NumSurfs);
  88.         //Print(MyS);
  89.         Surfs = new SURFS[NumSurfs];
  90.         if(!Surfs) Print("NoSurfs!");
  91.         memcpy(Surfs,Find->Surfs,sizeof(SURFS)*NumSurfs);
  92.         for(tmp = 0;tmp<NumSurfs;tmp++){
  93.             tmp2=strlen(Find->Surfs[tmp].Name)+1;
  94.             Surfs[tmp].Name = new char[tmp2];
  95.             memcpy(Surfs[tmp].Name,Find->Surfs[tmp].Name,tmp2);
  96.         }
  97.         fclose(lwo);
  98.         return;
  99.     }
  100.     //Print("No Match");
  101.     strcpy(lwon,mlwo);
  102.  
  103.     fread(&String, sizeof(char),6,lwo);//Get the "form\0\0"
  104.     if (strcmpi(String,"FORM")!=0) return;
  105.     fread(&nada,sizeof(short),1,lwo);
  106.     fread(&String,sizeof(char),4,lwo);
  107.     if (strcmpi(String,"LWOB")!=0) return;
  108.  
  109.     //sprintf(MyS,"%i",tmp);
  110.     //Print(MyS);
  111.     posi = 0;
  112.     leng = 0;
  113.     while(posi + leng + 1 < size){
  114.         posi = ftell(lwo);
  115.         fread(&String,sizeof(char),6,lwo);
  116.         //Print(String);
  117.         fread(&leng,sizeof(short),1,lwo);
  118.         leng = BigShort(leng);
  119.         if(!strcmpi(String,"pnts")){
  120.             //Print(String);
  121.             //sprintf(MyS,"%i",leng);
  122.             //Print(MyS);
  123.             NumVerts = leng/12;
  124.             //sprintf(MyS,"%i",NumVerts);
  125.             //Print(MyS);
  126.             Verts = new GrVertex[NumVerts];
  127.             lit = new light_t[NumVerts];
  128.  
  129.             MatMakeYRot(roty, MaxAng/2);
  130.             for(tmp = 0;tmp<NumVerts;tmp++){
  131.                 fread(&pnt,sizeof(float),1,lwo);
  132.                 Verts[tmp].x = BigFloat(pnt);//*8;
  133.                 fread(&pnt,sizeof(float),1,lwo);
  134.                 Verts[tmp].y = BigFloat(pnt);//*8;
  135.                 fread(&pnt,sizeof(float),1,lwo);
  136.                 Verts[tmp].z = BigFloat(pnt);//*8;
  137.                 //sprintf(MyS,"%f %f %f",Verts[tmp].x,Verts[tmp].y,Verts[tmp].z);
  138.                 //Print(MyS);
  139.                 //tmp2 = (Verts[tmp].y+16)*8;
  140.                 //if (tmp2 > 255) tmp2 = 255;
  141.                 //if (tmp2 <0) tmp2 = 0;
  142.                 Verts[tmp].r = 0;
  143.                 Verts[tmp].g = 128;
  144.                 Verts[tmp].b = 128;
  145.                 Verts[tmp].a = 255;
  146.                 PointMatMult(&Verts[tmp],&Verts[tmp],roty);
  147.  
  148.             }
  149.         }
  150.         else if(!strcmpi(String,"Pols")){
  151.             //Print(String);
  152.             //Damned thing won't tell me how many faces there are.  I have to count first.
  153.             posi = ftell(lwo);
  154.             tmp = 0;
  155.             while (posi+leng > ftell(lwo)){
  156.                 tmp++;
  157.                 fread(&num,sizeof(short),1,lwo);
  158.                 num=BigShort(num)*2;
  159.                 fseek(lwo,num,SEEK_CUR);
  160.                 fread(&num,sizeof(short),1,lwo);
  161.                 num = BigShort(num);
  162.                 if(num < 0)
  163.                     fread(&num,sizeof(short),1,lwo);
  164.  
  165.             }
  166.             Tris = new faces_t[tmp];
  167.             NumTris = tmp;
  168.             fseek(lwo,posi,SEEK_SET);
  169.             //sprintf(MyS," Num Faces: %i",tmp);
  170.             //Print(MyS);
  171.             for (tmp2 = 0;tmp2<tmp;tmp2++){
  172.                 fread(&num,sizeof(short),1,lwo);
  173.                 num = BigShort(num);
  174.                 Tris[tmp2].NumSides=num;
  175.                 Tris[tmp2].ndx = new int[num];
  176.                 //sprintf(MyS,"Sides: %i",num);
  177.                 for(tmp3 =0;tmp3<num;tmp3++){
  178.                     fread(&corn,sizeof(short),1,lwo);
  179.                     Tris[tmp2].ndx[tmp3] = BigShort(corn);
  180.                     Tris[tmp2].surfclr = 0;
  181.                     //sprintf(MyS,"%s %i",MyS,Tris[tmp2].ndx[tmp3]);
  182.                 }
  183.                 fread(&corn,sizeof(short),1,lwo);
  184.                 corn = BigShort(corn);
  185.                 Tris[tmp2].Surf = corn;
  186.                 if(Tris[tmp2].Surf<0)
  187.                     Tris[tmp2].Surf=-Tris[tmp2].Surf;
  188.                 Tris[tmp2].Surf--;
  189.                 //sprintf(MyS,"%s Surf:%i",MyS,corn);
  190.                 //Print(MyS);
  191.                 if(corn < 0)
  192.                     fread(&corn,sizeof(short),1,lwo);
  193.             }
  194.  
  195.         }
  196.         else if(!strcmpi(String,"Srfs")){
  197.             //Print(String);
  198.             //sprintf(MyS,"%i",leng);
  199.             posi = ftell(lwo);
  200.             //Print(MyS);
  201.             tmp = 0;
  202.             while (posi+leng > ftell(lwo)){
  203.                 fread(&J,sizeof(char),2,lwo);
  204.                 if(J[0]==0 || J[1]==0) tmp++;
  205.             }
  206.             Surfs=new SURFS[tmp];
  207.             NumSurfs=tmp;
  208.             fseek(lwo,posi,SEEK_SET);
  209.             tmp=0;
  210.             String[0] = 0;
  211.             while (posi+leng > ftell(lwo)){
  212.                 fread(&J,sizeof(char),2,lwo);
  213.                 strcat(String,J);
  214.                 if(J[0]==0 || J[1]==0) {
  215.                     tmp2 = strlen(String)+1;
  216.                     Surfs[tmp].Name = new char[tmp2];
  217.                     strcpy(Surfs[tmp].Name,String);
  218.                     //Print(String);
  219.                     String[0]=0;
  220.                     tmp++;
  221.                 }
  222.             }
  223.  
  224.         }
  225.         else if(!strcmpi(String,"Surf")){
  226.             //Print(String);
  227.             //sprintf(MyS,"%i",leng);
  228.             //Print(MyS);
  229.             posi = ftell(lwo);
  230.             tmp = 0;
  231.             tmp=0;
  232.             String[0] = 0;
  233.             while (1){
  234.                 fread(&J,sizeof(char),2,lwo);
  235.                 strcat(String,J);
  236.                 if(J[0]==0 || J[1]==0)
  237.                     break;
  238.             }
  239.  
  240.             for(tmp = 0;tmp<NumSurfs;tmp++){
  241.                 if (!strcmpi(String,Surfs[tmp].Name))
  242.                     break;
  243.             }
  244.             if (tmp < NumSurfs){
  245.  
  246.                 short leng2;
  247.                 while (posi+leng > ftell(lwo)){
  248.                     fread(&String,sizeof(char),4,lwo);
  249.                     String[4]=0;
  250.                     fread(&leng2,sizeof(short),1,lwo);
  251.                     leng2 = BigShort(leng2);
  252.                     if(!strcmpi(String,"Colr")){
  253.                         fread(J,sizeof(char),1,lwo);
  254.                         Surfs[tmp].r = J[0];
  255.                         //sprintf(MyS,"%i",J[0]);
  256.                         fread(J,sizeof(char),1,lwo);
  257.                         Surfs[tmp].g= J[0];
  258.                         //sprintf(MyS,"%s %i",MyS,J[0]);
  259.                         fread(J,sizeof(char),1,lwo);
  260.                         Surfs[tmp].b= J[0];
  261.                         //sprintf(MyS,"%s %i",MyS,J[0]);
  262.                         fread(J,sizeof(char),1,lwo);
  263.                         Surfs[tmp].a= J[0];
  264.                         //sprintf(MyS,"%s %i",MyS,J[0]);
  265.                         //Print(MyS);
  266.                         if(Surfs[tmp].a ==0)
  267.                             Surfs[tmp].a = 255;
  268.                         //sprintf(MyS,"col: %i %i %i %i",Surfs[tmp].r,Surfs[tmp].g,Surfs[tmp].b,Surfs[tmp].a);
  269.                         //Print(MyS);
  270.                     }
  271.                     else if(!strcmpi(String,"Flag")){
  272.                         fread(&nada,sizeof(short),1,lwo);
  273.                         Surfs[tmp].Flags = BigShort(nada);
  274.                     }
  275.                     else if(!strcmpi(String,"Lumi")){
  276.                         fread(&nada,sizeof(short),1,lwo);
  277.                         Surfs[tmp].Lumi = BigShort(nada);
  278.                     }
  279.                     else if(!strcmpi(String,"Spec")){
  280.                         fread(&nada,sizeof(short),1,lwo);
  281.                         Surfs[tmp].Spec = BigShort(nada);
  282.                     }
  283.                     else if(!strcmpi(String,"Diff")){
  284.                         fread(&nada,sizeof(short),1,lwo);
  285.                         Surfs[tmp].Diff = BigShort(nada);
  286.                     }
  287.                     else if(!strcmpi(String,"Refl")){
  288.                         fread(&nada,sizeof(short),1,lwo);
  289.                         Surfs[tmp].Refl = BigShort(nada);
  290.                     }
  291.                     else if(!strcmpi(String,"Tran")){
  292.                         fread(&nada,sizeof(short),1,lwo);
  293.                         //Print("Has Alpha");
  294.                         Surfs[tmp].a = Surfs[tmp].Tran = /*128-*/BigShort(nada);
  295.                         //sprintf(MyS,"%i",Surfs[tmp].a);
  296.                         //Print(MyS);
  297.                     }
  298.                     else if(!strcmpi(String,"Glos")){
  299.                         fread(&nada,sizeof(short),1,lwo);
  300.                         Surfs[tmp].Glos = BigShort(nada);
  301.                     }
  302.                     else if(!strcmpi(String,"TIMG")){
  303.                         //Print(String);
  304.                         String[0] = 0;
  305.                         while (1){
  306.                             fread(&J,sizeof(char),2,lwo);
  307.                             strcat(String,J);
  308.                             if(J[0]==0 || J[1]==0)
  309.                                 break;
  310.                         }
  311.                         //Print(String);
  312.                     }
  313.                     else if(!strcmpi(String,"CTEX")){
  314.                         //Print(String);
  315.                         String[0] = 0;
  316.                         while (1){
  317.                             fread(&J,sizeof(char),2,lwo);
  318.                             strcat(String,J);
  319.                             if(J[0]==0 || J[1]==0)
  320.                                 break;
  321.                         }
  322.                         //Print(String);
  323.                     }
  324.                     else{
  325.                         //Print(String);
  326.                         sprintf(MyS,"%i",leng2);
  327.                         //Print(MyS);
  328.                         fseek(lwo,leng2,SEEK_CUR);
  329.                     }
  330.                 }
  331.             }
  332.  
  333.             //fseek(lwo,posi,SEEK_SET);
  334.  
  335.         }
  336.         else{
  337.             //Print(String);
  338.             //sprintf(MyS,"%i",leng);
  339.             //Print(MyS);
  340.             fseek(lwo,leng,SEEK_CUR);
  341.             //fclose(lwo);
  342.             //return;
  343.         }
  344.     }
  345.     //LoadBall();
  346.     fclose(lwo);
  347. }
  348.  
  349.  
  350. void entity_t::render(Matrix rotc){
  351.     int tmp2,tmp,i,j,k,l,m,cl,sr;
  352.     //if(TryCount>600*frameCount) {return;}
  353.     //float yaw2;
  354.     if(flag == 1) return;
  355.     //GrVertex *
  356.     rVerts=new GrVertex[NumVerts];
  357.     GrVertex Cen;
  358.     MatMakeIdent(rote);
  359.     MatMakeYRot(roty, yaw);
  360.     MatMakeXRot(rotx, pitch);
  361.     MatMakeZRot(rotz, roll);
  362.     MatMultMat(roty,rote,rote);
  363.     MatMultMat(rotx,rote,rote);
  364.     MatMultMat(rotz,rote,rote);
  365.     for(tmp = 0;tmp<NumVerts;tmp++){
  366.             //rVerts[tmp].a = Verts[tmp].a;
  367.             //rVerts[tmp].r = Verts[tmp].r;
  368.             //rVerts[tmp].g = Verts[tmp].g;
  369.             //rVerts[tmp].b = Verts[tmp].b;
  370.             if(light == 0 && nolight == 0){
  371.                 lit[tmp].r=.6;
  372.                 lit[tmp].g=.6;
  373.                 lit[tmp].b=.6;
  374.             }
  375.             else{
  376.                 lit[tmp].r=1;
  377.                 lit[tmp].g=1;
  378.                 lit[tmp].b=1;
  379.             }
  380.             rVerts[tmp].x = Verts[tmp].x;
  381.             rVerts[tmp].y = Verts[tmp].y;
  382.             rVerts[tmp].z = Verts[tmp].z;
  383.             PointMatMult(&rVerts[tmp],&rVerts[tmp],rote);
  384.             rVerts[tmp].x += x;
  385.             rVerts[tmp].y += y;
  386.             rVerts[tmp].z += z;
  387.  
  388.     }
  389.     if(light == 0 && nolight == 0){  //don't light up other lights.
  390.         Other = Head;
  391.         while(Other){
  392.             if(Other != Self && Other->light && Other->locid>-1 && Other->locid<GridNum2 && land[Other->locid].rendered)
  393.                 castlight(Other);
  394.             Other = Other->next;
  395.         }
  396.     }
  397.     for(tmp = 0;tmp<NumVerts;tmp++){
  398.             rVerts[tmp].x -= Camx;
  399.             rVerts[tmp].y -= Camy;
  400.             rVerts[tmp].z -= Camz;
  401.             PointMatMult(&rVerts[tmp],&rVerts[tmp],rotc);
  402.             rVerts[tmp].ooz =
  403.             rVerts[tmp].oow = 1/rVerts[tmp].z;
  404.             rVerts[tmp].x = Camzoomx*rVerts[tmp].x*rVerts[tmp].ooz+wHWidth+vertex_snapper;
  405.             rVerts[tmp].y = Camzoomy*rVerts[tmp].y*rVerts[tmp].ooz+wHHeight+vertex_snapper;
  406.             rVerts[tmp].x -=vertex_snapper;
  407.             rVerts[tmp].y -=vertex_snapper;
  408.         }
  409.     for (tmp2=0;tmp2<NumTris;tmp2++){
  410.         //Print("Drawing");
  411.         i = Tris[tmp2].ndx[0];
  412.         if (rVerts[i].z<1) continue;
  413.         sr = Tris[tmp2].Surf;
  414.         cl = Tris[tmp2].surfclr;
  415.         if(cl == 0){
  416.             rVerts[i].r = Surfs[sr].r*lit[i].r;
  417.             rVerts[i].g = Surfs[sr].g*lit[i].g;
  418.             rVerts[i].b = Surfs[sr].b*lit[i].b;
  419.             rVerts[i].a = Surfs[sr].a;
  420.             if(rVerts[i].r>255) rVerts[i].r = 255;
  421.             if(rVerts[i].g>255) rVerts[i].g = 255;
  422.             if(rVerts[i].b>255) rVerts[i].b = 255;
  423.  
  424.         }
  425.         else{
  426.             rVerts[i].r = Verts[i].r*lit[i].r;
  427.             rVerts[i].g = Verts[i].g*lit[i].g;
  428.             rVerts[i].b = Verts[i].b*lit[i].b;
  429.             rVerts[i].a = Verts[i].a;
  430.             if(rVerts[i].r>255) rVerts[i].r = 255;
  431.             if(rVerts[i].g>255) rVerts[i].g = 255;
  432.             if(rVerts[i].b>255) rVerts[i].b = 255;
  433.         }
  434.         for(l = 1,m=2;m<Tris[tmp2].NumSides;l++,m++){
  435.             AttCount++;
  436.             j = Tris[tmp2].ndx[l];
  437.             k = Tris[tmp2].ndx[m];
  438.             if (rVerts[j].z<1 || rVerts[k].z<1) break;
  439.             //Print("Passed z test");
  440.  
  441.             if (//Backface removal
  442.                 ((rVerts[j].x - rVerts[i].x)*
  443.                 (rVerts[k].y - rVerts[i].y)-
  444.                 (rVerts[j].y - rVerts[i].y)*
  445.                 (rVerts[k].x - rVerts[i].x))>0)
  446.                 break;
  447.             //Print("Passed backface test");
  448.             if(cl == 0){
  449.                 if(l == 1){
  450.                     rVerts[j].r = Surfs[sr].r*lit[j].r;
  451.                     rVerts[j].g = Surfs[sr].g*lit[j].g;
  452.                     rVerts[j].b = Surfs[sr].b*lit[j].b;
  453.                     rVerts[j].a = Surfs[sr].a;
  454.                     if(rVerts[j].r>255) rVerts[j].r = 255;
  455.                     if(rVerts[j].g>255) rVerts[j].g = 255;
  456.                     if(rVerts[j].b>255) rVerts[j].b = 255;
  457.                 }
  458.  
  459.                 rVerts[k].r = Surfs[sr].r*lit[k].r;
  460.                 rVerts[k].g = Surfs[sr].g*lit[k].g;
  461.                 rVerts[k].b = Surfs[sr].b*lit[k].b;
  462.                 rVerts[k].a = Surfs[sr].a;
  463.                 if(rVerts[k].r>255) rVerts[k].r = 255;
  464.                 if(rVerts[k].g>255) rVerts[k].g = 255;
  465.                 if(rVerts[k].b>255) rVerts[k].b = 255;
  466.             }
  467.             else{
  468.             if(l == 1){
  469.                 rVerts[j].r = Verts[j].r*lit[j].r;
  470.                 rVerts[j].g = Verts[j].g*lit[j].g;
  471.                 rVerts[j].b = Verts[j].b*lit[j].b;
  472.                 rVerts[j].a = Verts[j].a;
  473.                 if(rVerts[j].r>255) rVerts[j].r = 255;
  474.                 if(rVerts[j].g>255) rVerts[j].g = 255;
  475.                 if(rVerts[j].b>255) rVerts[j].b = 255;
  476.             }
  477.  
  478.             rVerts[k].r = Verts[k].r*lit[k].r;
  479.             rVerts[k].g = Verts[k].g*lit[k].g;
  480.             rVerts[k].b = Verts[k].b*lit[k].b;
  481.             rVerts[k].a = Verts[k].a;
  482.             if(rVerts[k].r>255) rVerts[k].r = 255;
  483.             if(rVerts[k].g>255) rVerts[k].g = 255;
  484.             if(rVerts[k].b>255) rVerts[k].b = 255;
  485.             }
  486.             /*if(rVerts[i].x>0 && rVerts[i].x<wWidth &&
  487.                rVerts[j].x>0 && rVerts[j].x<wWidth &&
  488.                rVerts[k].x>0 && rVerts[k].y<wWidth &&
  489.                rVerts[i].y>0 && rVerts[i].y<wHeight &&
  490.                rVerts[j].y>0 && rVerts[j].y<wHeight &&
  491.                rVerts[k].y>0 && rVerts[k].y<wHeight)
  492.                 grDrawTriangle(&rVerts[i],&rVerts[j],&rVerts[k]);
  493.             else*/
  494.             if(rVerts[i].x<0 || rVerts[j].x<0 || rVerts[k].x<0 ||
  495.                     rVerts[i].y<0 || rVerts[j].y<0 || rVerts[k].y<0 ||
  496.                     rVerts[i].x>wWidth || rVerts[j].x>wWidth || rVerts[k].x>wWidth ||
  497.                     rVerts[i].y>wHeight || rVerts[j].y>wHeight || rVerts[k].y>wHeight)
  498.  
  499.                 guDrawTriangleWithClip(&rVerts[i],&rVerts[j],&rVerts[k]);
  500.             else
  501.                 grDrawTriangle(&rVerts[i],&rVerts[j],&rVerts[k]);
  502.             //Print("Drawn");
  503.             TryCount++;
  504.             //if(TryCount>600*frameCount) {delete rVerts;return;}
  505.  
  506.         }
  507.  
  508.         //MyDrawTriangle(Verts[i],Verts[j],Verts[k]);
  509.     }
  510.     //for(tmp = 0;tmp<NumVerts;tmp++){
  511.  
  512.     //}
  513.     delete rVerts;
  514. }
  515.  
  516.  
  517. entity_t::entity_t(){
  518.     Owner = 0;
  519.     MyShootTime=0;
  520.     ox =    oy =    oz =
  521.     dx =    dy =    dz =
  522.     x =    y =    z =
  523.     yaw =    pitch =    roll =
  524.     ax =     ay =    az =
  525.     dyaw =    dpitch =    droll =
  526.     ayaw =    apitch =    aroll =
  527.     flag =
  528.     useinput =
  529.     zoomx =    zoomy = 0;
  530.     Verts = 0;
  531.     Tris =  0;
  532.     Surfs = 0;
  533.     NumSurfs =    NumTris =    NumVerts =
  534.     BoxX[0] =    BoxX[1] =
  535.     BoxY[0] =    BoxY[1] =
  536.     BoxZ[0] =    BoxZ[1] = 0;
  537.     prev =     next = 0;
  538.     thinktime = 0;
  539.     nolight = lightr = lightg = lightb = lighta = light = 0;
  540.     die = 0;
  541.     lwon=0;
  542. }
  543.  
  544. entity_t::entity_t(char *lwo){
  545.     Owner = 0;    MyShootTime=0;
  546.  
  547.     ox =    oy =    oz =
  548.     dx =    dy =    dz =
  549.     x =    y =    z =
  550.     yaw =    pitch =    roll =
  551.     ax =     ay =    az =
  552.     dyaw =    dpitch =    droll =
  553.     ayaw =    apitch =    aroll =
  554.     flag =
  555.     useinput =
  556.     zoomx =    zoomy = 0;
  557.     Verts = 0;
  558.     Tris =  0;
  559.     Surfs = 0;
  560.     NumSurfs =    NumTris =    NumVerts =
  561.     BoxX[0] =    BoxX[1] =
  562.     BoxY[0] =    BoxY[1] =
  563.     BoxZ[0] =    BoxZ[1] = 0;
  564.     prev =     next = 0;
  565.     thinktime = 0;
  566.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  567.     lwon=0;
  568.     LoadLWO(lwo);
  569.     die = 0;
  570. }
  571.  
  572. entity_t::entity_t(float ix, float iy, float iz){
  573.     Owner = 0;    MyShootTime=0;
  574.  
  575.     ox =    oy =    oz =
  576.     dx =    dy =    dz = 0;
  577.     x = ix;    y = iy;   z = iz;
  578.     yaw =    pitch =    roll =
  579.     ax =     ay =    az =
  580.     dyaw =    dpitch =    droll =
  581.     ayaw =    apitch =    aroll =
  582.     flag =
  583.     useinput =
  584.     zoomx =    zoomy = 0;
  585.     Verts = 0;
  586.     Tris =  0;
  587.     Surfs = 0;
  588.     NumSurfs =    NumTris =    NumVerts =
  589.     BoxX[0] =    BoxX[1] =
  590.     BoxY[0] =    BoxY[1] =
  591.     BoxZ[0] =    BoxZ[1] = 0;
  592.     prev =     next = 0;
  593.     thinktime = 0;
  594.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  595.     die = 0;
  596.     lwon=0;
  597. }
  598. entity_t::entity_t(float ix, float iy, float iz,float idx, float idy, float idz){
  599.     MyShootTime=0;
  600.     Owner = 0;
  601.     ox =    oy =    oz = 0;
  602.     dx = idx;
  603.     dy = idy;
  604.     dz = idz;
  605.     x = ix;
  606.     y = iy;
  607.     z = iz;
  608.     yaw =    pitch =    roll =
  609.     ax =     ay =    az =
  610.     dyaw =    dpitch =    droll =
  611.     ayaw =    apitch =    aroll =
  612.     flag =
  613.     useinput =
  614.     zoomx =    zoomy = 0;
  615.     Verts = 0;
  616.     Tris =  0;
  617.     Surfs = 0;
  618.     NumSurfs =    NumTris =    NumVerts =
  619.     BoxX[0] =    BoxX[1] =
  620.     BoxY[0] =    BoxY[1] =
  621.     BoxZ[0] =    BoxZ[1] = 0;
  622.     prev =     next = 0;
  623.     thinktime = 0;
  624.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  625.     die = 0;
  626.     lwon=0;
  627. }
  628.  
  629. entity_t::entity_t(float ix, float iy, float iz,float idx, float idy, float idz,float iyaw, float ipitch, float iroll){
  630.     MyShootTime=0;
  631.     Owner = 0;
  632.     ox =    oy =    oz = 0;
  633.     dx = idx;
  634.     dy = idy;
  635.     dz = idz;
  636.     x = ix;
  637.     y = iy;
  638.     z = iz;
  639.     yaw = iyaw;
  640.     pitch = ipitch;
  641.     roll = iroll;
  642.     ax =     ay =    az =
  643.     dyaw =    dpitch =    droll =
  644.     ayaw =    apitch =    aroll =
  645.     flag =
  646.     useinput =
  647.     zoomx =    zoomy = 0;
  648.     Verts = 0;
  649.     Tris =  0;
  650.     Surfs = 0;
  651.     NumSurfs =    NumTris =    NumVerts =
  652.     BoxX[0] =    BoxX[1] =
  653.     BoxY[0] =    BoxY[1] =
  654.     BoxZ[0] =    BoxZ[1] = 0;
  655.     prev =     next = 0;
  656.     thinktime = 0;
  657.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  658.     yaw = iyaw;
  659.     pitch = ipitch;
  660.     roll = iroll;
  661.     die = 0;
  662.     lwon=0;
  663. }
  664.  
  665. entity_t::entity_t(char *rlwo,float ix, float iy, float iz){
  666.     MyShootTime=0;
  667.     Owner = 0;
  668.     ox =    oy =    oz =
  669.     dx =    dy =    dz = 0;
  670.     x = ix;
  671.     y = iy;
  672.     z = iz;
  673.     yaw =    pitch =    roll =
  674.     ax =     ay =    az =
  675.     dyaw =    dpitch =    droll =
  676.     ayaw =    apitch =    aroll =
  677.     flag =
  678.     useinput =
  679.     zoomx =    zoomy = 0;
  680.     Verts = 0;
  681.     Tris =  0;
  682.     Surfs = 0;
  683.     NumSurfs =    NumTris =    NumVerts =
  684.     BoxX[0] =    BoxX[1] =
  685.     BoxY[0] =    BoxY[1] =
  686.     BoxZ[0] =    BoxZ[1] = 0;
  687.     prev =     next = 0;
  688.     thinktime = 0;
  689.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  690.     x = ix;
  691.     y = iy;
  692.     z = iz;
  693.     lwon=0;
  694.     LoadLWO(rlwo);
  695.     die = 0;
  696. }
  697. entity_t::entity_t(char *lwo,float ix, float iy, float iz,float idx, float idy, float idz){
  698.     MyShootTime=0;
  699.     Owner = 0;
  700.     ox =    oy =    oz = 0;
  701.     dx = idx;
  702.     dy = idy;
  703.     dz = idz;
  704.     x = ix;
  705.     y = iy;
  706.     z = iz;
  707.     yaw =    pitch =    roll =
  708.     ax =     ay =    az =
  709.     dyaw =    dpitch =    droll =
  710.     ayaw =    apitch =    aroll =
  711.     flag =
  712.     useinput =
  713.     zoomx =    zoomy = 0;
  714.     Verts = 0;
  715.     Tris =  0;
  716.     Surfs = 0;
  717.     NumSurfs =    NumTris =    NumVerts =
  718.     BoxX[0] =    BoxX[1] =
  719.     BoxY[0] =    BoxY[1] =
  720.     BoxZ[0] =    BoxZ[1] = 0;
  721.     prev =     next = 0;
  722.     thinktime = 0;
  723.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  724.     dx = idx;
  725.     dy = idy;
  726.     dz = idz;
  727.     lwon=0;
  728.     LoadLWO(lwo);
  729.     die = 0;
  730. }
  731.  
  732. entity_t::entity_t(char *lwo,float ix, float iy, float iz,float idx, float idy, float idz,float iyaw, float ipitch, float iroll){
  733.     MyShootTime=0;
  734.     Owner = 0;
  735.     ox =    oy =    oz =
  736.     dx = idx;
  737.     dy = idy;
  738.     dz = idz;
  739.     x = ix;
  740.     y = iy;
  741.     z = iz;
  742.     yaw = iyaw;
  743.     pitch = ipitch;
  744.     roll = iroll;
  745.     ax =     ay =    az = 0;
  746.     dyaw =  0;  dpitch =  0;  droll = 0;
  747.     ayaw =    apitch =    aroll =
  748.     flag =
  749.     useinput =
  750.     zoomx =    zoomy = 0;
  751.     Verts = 0;
  752.     Tris =  0;
  753.     Surfs = 0;
  754.     NumSurfs =    NumTris =    NumVerts =
  755.     BoxX[0] =    BoxX[1] =
  756.     BoxY[0] =    BoxY[1] =
  757.     BoxZ[0] =    BoxZ[1] = 0;
  758.     prev =     next = 0;
  759.     thinktime = 0;
  760.     nolight =     lightr = lightg = lightb = lighta = light = 0;
  761.     lwon=0;
  762.     LoadLWO(lwo);
  763.     die = 0;
  764. }
  765.  
  766. void entity_t::setsize(float lx, float ly, float lz, float hx, float hy, float hz){
  767.     BoxX[0] = lx;
  768.     BoxX[1] = hx;
  769.     BoxY[0] = ly;
  770.     BoxY[1] = hy;
  771.     BoxZ[0] = lz;
  772.     BoxZ[1] = hz;
  773.     rad = ((hx-lx)/2 + (hy-ly)/2 + (hz-lz)/2)/3 + 2;
  774. }
  775.  
  776. entity_t::~entity_t(){
  777.     int tmp,tmp2,tmp3;
  778.     if(next && prev){
  779.         //Print("Delete, remove");
  780.         prev->next = next;
  781.         next->prev = prev;
  782.         //Print("Delete, removed");
  783.     }
  784.     else if(prev){
  785.         //Print("Delete, truncate");
  786.         Tail = prev;
  787.         prev->next = 0;
  788.         //Print("Delete, truncated");
  789.     }
  790.     else if(next){
  791.         //Print("Delete, shorten");
  792.         Head = next;
  793.         next->prev = 0;
  794.         //Print("Delete, shortened");
  795.     }
  796.     if(Verts) {delete Verts;delete lit;}
  797.     //Print("Killed Verts");
  798.     for(tmp = 0;tmp<NumTris;tmp++)
  799.         delete Tris[tmp].ndx;
  800.     //Print("Killed Polys");
  801.     if(Tris) delete Tris;
  802.     //Print("Killed Tris");
  803.     for(tmp = 0;tmp<NumSurfs;tmp++)
  804.         delete Surfs[tmp].Name;
  805.     //Print("Killed Surfs");
  806.     if(Surfs) delete Surfs;
  807.     //Print("Killed Surfs 2");
  808.     if(lwon) delete lwon;
  809.     //Print("Killed lwo name");
  810.  
  811. }
  812. void entity_t::fov(){
  813.     zoomx = gfov*wHWidth;
  814.     zoomy = gfov*wHHeight*aspect;
  815.     Camzoomx = zoomx;
  816.     Camzoomy = zoomy;
  817.     float alpha2 = alpha/2;
  818.     alpha2 = alpha2*MaxAng/360;
  819.     FoVTri[0].x = 0;
  820.     FoVTri[0].y = 0;
  821.     FoVTri[0].z = -450;
  822.     FoVTri[1].x = -Sin[(int)alpha2]/Cos[(int)alpha2]*dist;
  823.     FoVTri[1].y = 0;
  824.     FoVTri[1].z = dist;
  825.     FoVTri[2].x = -FoVTri[1].x;
  826.     FoVTri[2].y = 0;
  827.     FoVTri[2].z = dist;
  828. }
  829. int entity_t::collide(entity_t *Other){
  830.     if (Other == Owner) return 0;
  831.  
  832.     int totrad = rad;
  833.     //if(Other->rad<100)
  834.         totrad+=Other->rad;
  835.     //else
  836.     //    totrad+=12;
  837.     float rdx,rdy,rdz,a,b;
  838.     rdx = abs(Other->x - x);
  839.     rdy = abs(Other->y - y);
  840.     rdz = abs(Other->z - z);
  841.     if (totrad>rdx && totrad>rdy && totrad>rdz){
  842.         //sprintf(MyS,"%s %s %f %f %i %i",lwon,Other->lwon,a,b,rad,Other->rad);
  843.         //Print(MyS);
  844.         //Print("collide!");
  845.         return 1;
  846.     }
  847.     rdx += abs(Other->ox - ox);
  848.     rdy += abs(Other->oy - oy);
  849.     rdz += abs(Other->oz - oz);
  850.     rdx/=2;
  851.     rdy/=2;
  852.     rdz/=2;
  853.     if (totrad>rdx && totrad>rdy && totrad>rdz){
  854.         //sprintf(MyS,"%s %s %f %f %i %i",lwon,Other->lwon,a,b,rad,Other->rad);
  855.         //Print(MyS);
  856.         //Print("collide!");
  857.         return 1;
  858.     }
  859.     return 0;
  860.  
  861. }
  862. int entity_t::collide(){//for land
  863.     int numg = GridNum*GridNum,vrtx,vrtz;
  864.     int lx,lz;
  865.     int id = 0;
  866.     //for (id=0;id<numg;id++){
  867.     //    if(x > land[id].minx && x < land[id].maxx && z > land[id].minz && z < land[id].maxz){
  868.     //        locid=id;
  869.     //        break;
  870.     //    }
  871.     //}
  872.     lx = x/gridsep;
  873.     lz = z/gridsep;
  874.     if(lx<GridNum && lx>-1 && lz<GridNum && lz>-1)
  875.         id = (lx)*GridNum+lz;
  876.     else id = -1;
  877.     locid = id;
  878.     if(movetype == move_roll || movetype == 4 || movetype == move_fly){
  879.         if(x<0 || x >= LevMax || z<0 || z >= LevMax || id < 0){
  880.             if(movetype == 4){
  881.                 die = 1;
  882.                 return 0;
  883.             }
  884.             //sprintf(MyS,"%f %f (%f %f) (%f %f) %i",x,z,redx,redz,ox,oz,LevMax);
  885.             //Print(MyS);
  886.             x = random(LevMax);
  887.             z = random(LevMax);
  888.             return 0;
  889.         }
  890.         //sprintf(MyS,"%i",id);
  891.         //Print(MyS);
  892.         lx = x - land[locid].minx;
  893.         lz = z - land[locid].minz;
  894.         vrtx = x/vertsep;
  895.         vrtz = z/vertsep;
  896.         if( Start[vrtz*(width)+vrtx].y/*land[locid].Start[vrtz*(tdx+1)+vrtx].y*/ +rad*2 < y){
  897.             if(movetype!= move_fly)
  898.                 ay = -80;
  899.         }
  900.         else{
  901.             y = Start[vrtz*(width)+vrtx].y/*land[locid].Start[vrtz*(tdx+1)+vrtx].y*/+rad*2;
  902.             droll = 0;
  903.             dy = 5;
  904.             ay = 0;
  905.         }
  906.     }
  907.     if(movetype == 3){
  908.         if(id == -1) {die = 1;return 1;}
  909.         lx = x - land[locid].minx;
  910.         lz = z - land[locid].minz;
  911.         vrtx = x/vertsep;
  912.         vrtz = z/vertsep;
  913.         if( Start[vrtz*(width)+vrtx].y/*land[locid].Start[vrtz*(tdx+1)+vrtx].y*/+rad*2 > y){
  914.             die = 1;
  915.             return 1;
  916.         }
  917.     }
  918.     return 0;
  919. }
  920. int entity_t::move(){
  921.     float dxr,dyr,dzr,c,s;
  922.  
  923.     if(flag == 5 && Enemy == 0){
  924.         entity_t *Find = Head;
  925.         float edu = -1;
  926.         while(Find){
  927.             if(Find==Self || (Find->movetype != move_roll && Find->movetype != move_fly)){
  928.                 Find = Find->next;
  929.                 continue;
  930.             }
  931.  
  932.             float fdn = -Find->x+x-Find->redx,
  933.             fdm =-Find->z+z-Find->redz,
  934.             fdp = -Find->y+y-Find->redy,
  935.             fdu = sqrt(fdm*fdm+fdn*fdn+fdp*fdp);
  936.             if(edu== -1 || edu>fdu){
  937.                 Enemy = Find;
  938.                 edu = fdu;
  939.             }
  940.           Find = Find->next;
  941.  
  942.         }
  943.     }
  944.     if(flag == 4 || flag == 5){//Autopiolot
  945.         float newyaw=0,newpitch=0,tmpyaw=0,tmppitch=0;
  946.         //entity_t *Enemy = next;
  947.         float dn = -Enemy->x+x-Enemy->redx,dm =-Enemy->z+z-Enemy->redz,dp = -Enemy->y+y-Enemy->redy,du = sqrt(dm*dm+dn*dn+dp*dp);
  948.         if (dm)
  949.             newyaw = MaxAng*(atan(dn/dm))/M_PIx2;
  950.         else{
  951.             if(dn > 0)
  952.                 newyaw = MaxAng/2;
  953.             else
  954.                 newyaw = 0;
  955.         }
  956.         if(dm>0)
  957.             newyaw+=MaxAng/2;
  958.  
  959.         newpitch = 0;
  960.  
  961.  
  962.         dz = 1;
  963.         if(y < 500){
  964.             newpitch = -10*Deg;
  965.         }
  966.         else if(y > 600){
  967.             newpitch = 10*Deg;
  968.         }
  969.  
  970.         while(newyaw<0)
  971.             newyaw+=MaxAng;
  972.  
  973.         //if(newyaw>MaxAng/2)
  974.         //    newyaw -=MaxAng;
  975.  
  976.         //if(yaw>MaxAng/2)
  977.         //    yaw -=MaxAng;
  978.  
  979.         tmpyaw = yaw - newyaw;
  980.         if(tmpyaw>MaxAng/2)
  981.             tmpyaw-=MaxAng;
  982.         if(tmpyaw<-MaxAng/2)
  983.             tmpyaw+=MaxAng;
  984.  
  985.         if(tmpyaw<-1.5*Deg){
  986.             dyaw=1*Deg;
  987.             dz = 1;
  988.         }
  989.         if(tmpyaw>1.5*Deg){
  990.             dyaw=-1*Deg;
  991.             dz = 1;
  992.         }
  993.         if(tmpyaw<-5.5*Deg){
  994.             dyaw=5*Deg;
  995.             dz = .7;
  996.         }
  997.         if(tmpyaw>+5.5*Deg){
  998.             dyaw=-5*Deg;
  999.             dz = .7;
  1000.         }
  1001.         if(tmpyaw<-15.5*Deg){
  1002.             dyaw=15*Deg;
  1003.             dz = .5;
  1004.         }
  1005.         if(tmpyaw>15.5*Deg){
  1006.             dyaw=-15*Deg;
  1007.             dz = .5;
  1008.         }
  1009.         if(tmpyaw>-Deg && tmpyaw<Deg){
  1010.             dyaw =0;
  1011.             yaw = newyaw;
  1012.             dz = 1;
  1013.         }
  1014.  
  1015.         if(movetype == move_fly && du<4000){
  1016.             newpitch = MaxAng*(asin(dp/du))/M_PIx2;
  1017.             dz = .2;
  1018.         }
  1019.  
  1020.         if(movetype == move_roll && du<4000){
  1021.             newpitch = MaxAng*(asin(dp/du))/M_PIx2;
  1022.             dz = .3;
  1023.         }
  1024.  
  1025.         //while(newpitch<0)
  1026.         //    newpitch+=MaxAng;
  1027.         if(pitch>MaxAng/2)
  1028.             pitch -=MaxAng;
  1029.  
  1030.  
  1031.         if(movetype == move_fly){
  1032.  
  1033.             tmppitch = pitch - newpitch;
  1034.  
  1035.             if(tmppitch<-6*Deg){
  1036.                 dpitch=6*Deg;
  1037.             }
  1038.             else if(tmppitch>6*Deg){
  1039.                 dpitch=-6*Deg;
  1040.             }
  1041.             else if(tmppitch<-3*Deg){
  1042.                 dpitch=3*Deg;
  1043.             }
  1044.             else if(tmppitch>3*Deg){
  1045.                 dpitch=-3*Deg;
  1046.             }
  1047.             else if(tmppitch<Deg){
  1048.                 dpitch=Deg;
  1049.             }
  1050.             else if(tmppitch>Deg){
  1051.                 dpitch=-Deg;
  1052.             }
  1053.             else{
  1054.                 dpitch = 0;
  1055.                 pitch = newpitch;
  1056.             }
  1057.         }
  1058.         //sprintf(MyS,"%f %f %f %f %f %f %f",yaw/Deg,pitch/Deg,newyaw/Deg,newpitch/Deg,du,tmpyaw/Deg,tmppitch/Deg);
  1059.         //Print(MyS);
  1060.         if(Camera.next == Self){
  1061.             Camera.iyaw = -tmpyaw;
  1062.             Camera.ipitch = -tmppitch;
  1063.             if(Camera.dpitch<0) Camera.dpitch = 0;
  1064.         }
  1065.  
  1066.         if(movetype == move_fly && du<2000 && MyShootTime < GameTime){
  1067.                 MyShootTime = .4+GameTime;
  1068.                 Tail->next = new entity_t("laser2.lwo",x,y,z,0,0,(dz*1000)+600,yaw,pitch,0);
  1069.                 //dz = .2;
  1070.                 if(!Tail->next) Print("WTF!?");
  1071.                 Tail->next->prev = Tail;
  1072.                 Tail = Tail->next;
  1073.                 Tail->lights(255,10,255,64,4);
  1074.                 Tail->setit(setmove,3);
  1075.                 Tail->thinktime = GameTime+3;
  1076.                 Tail->setsize(-5,-5,-5,5,5,5);
  1077.                 Tail->Owner = Self;
  1078.         }
  1079.  
  1080.         if(movetype == move_roll){
  1081.             dpitch = 0;
  1082.             dyaw /=2;
  1083.             dz =150;
  1084.         }
  1085.  
  1086.         if(movetype == move_roll && du<4000 && MyShootTime < GameTime){
  1087.             //dz = .3;
  1088.  
  1089.             /*while(newyaw<0)
  1090.                 newyaw+=MaxAng;
  1091.             while(newpitch<0)
  1092.                 newpitch+=MaxAng;
  1093.             while(newyaw>=MaxAng)
  1094.                 newyaw-=MaxAng;
  1095.             while(newpitch>=MaxAng)
  1096.                 newpitch-=MaxAng;*/
  1097.                 //sprintf(MyS,"%f %f %f",redx/dz,redz/dz,dz);
  1098.                 //Print(MyS);
  1099.             float rdx = 2*redx/dz, rdz = 2*redz/dz;
  1100.             Tail->next = new entity_t("laser1.lwo",x-rdx,y,z+rdz,0,0,500,newyaw,newpitch,0);
  1101.             Tail->next->prev = Tail;
  1102.             Tail = Tail->next;
  1103.             if(!Tail) Print("WTF!?");
  1104.             Tail->lights(255,255,10,64,4);
  1105.             Tail->setit(setmove,3);
  1106.             Tail->thinktime = GameTime+4;
  1107.             Tail->setsize(-1,-1,-1,1,1,1);
  1108.             Tail->Owner = Self;
  1109.             Tail->next = new entity_t("laser1.lwo",x+rdx,y,z-rdz,0,0,500,newyaw,newpitch,0);
  1110.             Tail->next->prev = Tail;
  1111.             Tail = Tail->next;
  1112.             if(!Tail) Print("WTF!?");
  1113.             Tail->nolight = 1;
  1114.             //Tail->lights(255,255,10,64,4);
  1115.             Tail->setit(setmove,3);
  1116.             Tail->thinktime = GameTime+4;
  1117.             Tail->setsize(-1,-1,-1,1,1,1);
  1118.             Tail->Owner = Self;
  1119.             MyShootTime = 1+GameTime;
  1120.         }
  1121.         if(movetype == move_fly){
  1122.             dz *=1000;
  1123.         }
  1124.  
  1125.     }
  1126.     if (useinput){
  1127.         /*ax = 0;
  1128.         ay = 0;
  1129.         az = 0;*/
  1130.         //dx = 0;
  1131.         if(movetype!= move_fly)
  1132.             dy = 0;
  1133.         apitch = 0;
  1134.         aroll = 0;
  1135.         ayaw = 0;
  1136.         dpitch = 0;
  1137.         droll = 0;
  1138.         dyaw = 0;
  1139.         dz = 0;//speed;
  1140.           float speed;
  1141.           if (keys[188])
  1142.               dist-=128;
  1143.         else if (keys[190])
  1144.             dist+=128;
  1145.         else if(keys[191]){
  1146.             Camera.fov();
  1147.             //sprintf(MyS,"%i",dist);
  1148.             //Print(MyS);
  1149.         }
  1150.           if (keys[VK_SHIFT])
  1151.               speed=128.f;
  1152.         else if (keys[VK_CONTROL])
  1153.             speed=16.f;
  1154.         else if (keys['M'])
  1155.             speed = 512.f;
  1156.         else
  1157.             speed=64.f;
  1158.         //dz = 1024.f;
  1159.         if (keys[VK_HOME]) dy+=speed;
  1160.         else if (keys[VK_END]) dy-=speed;
  1161.  
  1162.  
  1163.         if(keys['A']){
  1164.             dz+=speed*8;
  1165.         }
  1166.         if(keys['Z']){
  1167.             dz-=speed*8;
  1168.         }
  1169.  
  1170.         if(keys['X']){
  1171.             dx-=speed;
  1172.         }
  1173.         if(keys['C']){
  1174.             dx+=speed;
  1175.         }
  1176.         if (keys[VK_INSERT])
  1177.             droll+=speed*8;
  1178.  
  1179.         else if (keys[VK_DELETE])
  1180.             droll-=speed*8;
  1181.  
  1182.         if(keys['R']){
  1183.             roll = 8192;
  1184.             pitch = 0;
  1185.             yaw = 0;
  1186.         }
  1187.         if(keys['T']){
  1188.             roll = 0;
  1189.             pitch = 8192;
  1190.             yaw = 0;
  1191.         }
  1192.         if(keys['E']){
  1193.             roll = 0;
  1194.             pitch = 0;
  1195.             yaw = 8192;
  1196.         }
  1197.         if(keys['F']){
  1198.             roll = 0;
  1199.             pitch = 8192;
  1200.             yaw = 8192;
  1201.         }
  1202.         if(keys['W']){
  1203.             roll = 0;
  1204.             pitch = 4096;
  1205.             yaw = 4096;
  1206.         }
  1207.         int tk=-120;
  1208.         if(JoyActive){
  1209.             tk = JoyRead(mainhwnd,joynum);
  1210.             if(tk) JoyActive = 0;
  1211.             int ugh;
  1212.             ugh = JoyStats.dwYpos-JoyBias.Y;
  1213.             dpitch-=((float)(ugh)/16.f);
  1214.  
  1215.             //ugh = JoyStats.dwRpos-JoyBias.R;
  1216.             //dyaw+=((float)(ugh)/16.f);
  1217.  
  1218.             ugh = JoyStats.dwXpos-JoyBias.X;
  1219.             dyaw+=((float)(ugh)/8.f);
  1220.             ugh = JoyCaps.wZmax - JoyStats.dwZpos;//-JoyBias.Z;
  1221.             dz+=((float)(ugh)/16.f);
  1222.             if(JoyStats.dwButtons&1 && GameTime > MyShootTime){
  1223.                 MyShootTime = .1+GameTime;
  1224.                 /*entity_t *newe = Head;
  1225.                 while(newe->next){
  1226.                     newe=newe->next;
  1227.                 }*/
  1228.                 Tail->next = new entity_t("laser2.lwo",x,y,z,0,0,600+dz,yaw,pitch,0);
  1229.                 if(!Tail->next) Print("WTF!?");
  1230.                 Tail->next->prev = Tail;
  1231.                 Tail = Tail->next;
  1232.                 Tail->lights(255,10,255,64,4);
  1233.                 Tail->setit(setmove,3);
  1234.                 Tail->thinktime = GameTime+3;
  1235.                 Tail->setsize(-5,-5,-5,5,5,5);
  1236.                 Tail->Owner = Self;
  1237.             }
  1238.             if(JoyStats.dwButtons&2 && GameTime > MyShootTime){
  1239.                 Tail->next = new entity_t("laser1.lwo",x-2,y,z-2,0,0,500,yaw,pitch,0);
  1240.                 Tail->next->prev = Tail;
  1241.                 Tail = Tail->next;
  1242.                 if(!Tail) Print("WTF!?");
  1243.                 Tail->lights(255,255,10,64,4);
  1244.                 Tail->setit(setmove,3);
  1245.                 Tail->thinktime = GameTime+4;
  1246.                 Tail->setsize(-1,-1,-1,1,1,1);
  1247.                 Tail->Owner = Self;
  1248.                 Tail->next = new entity_t("laser1.lwo",x+2,y,z+2,0,0,500,yaw,pitch,0);
  1249.                 Tail->next->prev = Tail;
  1250.                 Tail = Tail->next;
  1251.                 if(!Tail) Print("WTF!?");
  1252.                 Tail->nolight = 1;
  1253.                 //Tail->lights(255,255,10,64,4);
  1254.                 Tail->setit(setmove,3);
  1255.                 Tail->thinktime = GameTime+4;
  1256.                 Tail->setsize(-1,-1,-1,1,1,1);
  1257.                 Tail->Owner = Self;
  1258.                 MyShootTime = 1+GameTime;
  1259.  
  1260.             }
  1261.  
  1262.         }
  1263.  
  1264.         if (keys[VK_UP])
  1265.             dpitch-=speed*8;
  1266.         else if (keys[VK_DOWN])
  1267.             dpitch+=speed*8;
  1268.  
  1269.         if (keys[VK_LEFT]) {
  1270.             //turn left
  1271.             dyaw -= (speed*8);
  1272.         }
  1273.         else if (keys[VK_RIGHT]) {
  1274.             //turn right
  1275.             dyaw += (speed*8);
  1276.         }
  1277.  
  1278.  
  1279.  
  1280.     }
  1281.     /*else {
  1282.         sprintf(MyS,"(%1.1f %1.1f %1.1f)",// (%1.1f %1.1f %1.1f) (%1.1f %1.1f %1.1f) (%1.1f %1.1f %1.1f)",
  1283.             dx,dy,dz);//,ax,ay,az,yaw,pitch,roll,dyaw,dpitch,droll);
  1284.         Print(MyS);
  1285.     }*/
  1286.     if(movetype == 4 && dz >0){
  1287.         az = -40;
  1288.     }
  1289.     if(movetype == 4 && dz <0){
  1290.         az = 0;
  1291.         dz = 0;
  1292.     }
  1293.  
  1294.     dx+=ax*dt;//Relative speeds
  1295.     dy+=ay*dt;
  1296.     dz+=az*dt;
  1297.     ox = x;
  1298.     oy = y;
  1299.     oz = z;
  1300.     if(movetype == move_roll){
  1301.         //Print("roll");
  1302.         dyaw +=ayaw*dt;
  1303.         yaw += dyaw*dt;
  1304.         dpitch +=apitch*dt;
  1305.         roll += droll*dt;
  1306.         while(roll < 0) roll +=MaxAng;
  1307.         while(roll >= MaxAng) roll -=MaxAng;
  1308.  
  1309.         c = Cos[(int)roll];
  1310.         s = Sin[(int)roll];
  1311.         pitch += (dpitch*c + dyaw*s)*dt;
  1312.         yaw += (dyaw*c - dpitch*s)*dt;
  1313.  
  1314.         while(yaw < 0) yaw +=MaxAng;
  1315.         while(pitch < 0) pitch +=MaxAng;
  1316.         while(yaw >= MaxAng) yaw -=MaxAng;
  1317.         while(pitch >= MaxAng) pitch -=MaxAng;
  1318.         while(roll < 0) roll +=MaxAng;
  1319.         while(roll >= MaxAng) roll -=MaxAng;
  1320.  
  1321.         float dxs=dx,dys=dy,dzs=dz;
  1322.         dyr = dys;
  1323.         c = Cos[(int)yaw];
  1324.         s = Sin[(int)yaw];
  1325.  
  1326.         dxr = dxs*c + dzs*s;
  1327.         dzr = dzs*c - dxs*s;
  1328.         dxs = dxr;
  1329.         dzs = dzr;
  1330.  
  1331.  
  1332.         x +=dxr*dt;
  1333.         y +=dyr*dt;
  1334.         z +=dzr*dt;
  1335.         redx = dxr;
  1336.         redy = dyr;
  1337.         redz = dzr;
  1338.  
  1339.     }
  1340.     else if(movetype == move_fly){
  1341.         //Print("fly");
  1342.         float ndroll=0, ndpitch=0,ndyaw=0;
  1343.         ndyaw = dyaw = dyaw + ayaw*dt;
  1344.         //yaw += dyaw*dt;
  1345.         ndpitch = dpitch = dpitch +apitch*dt;
  1346.         ndroll = droll;
  1347.         //roll += droll*dt;
  1348.         if(roll < 0) roll +=MaxAng;
  1349.         if(roll >= MaxAng) roll -=MaxAng;
  1350.  
  1351.         c = Cos[(int)roll];
  1352.         s = Sin[(int)roll];
  1353.         ndpitch += (dpitch*c + dyaw*s);
  1354.         ndyaw += (dyaw*c - dpitch*s);
  1355.  
  1356.         yaw +=ndyaw*dt;
  1357.         pitch +=ndpitch*dt;
  1358.         //roll +=ndroll*dt;
  1359.         while(yaw < 0) yaw +=MaxAng;
  1360.         while(pitch < 0) pitch +=MaxAng;
  1361.         while(yaw >= MaxAng) yaw -=MaxAng;
  1362.         while(pitch >= MaxAng) pitch -=MaxAng;
  1363.         while(roll < 0) roll +=MaxAng;
  1364.         while(roll >= MaxAng) roll -=MaxAng;
  1365.  
  1366.         float dxs=dx,dys=dy,dzs=dz;
  1367.  
  1368.         //sprintf(MyS,"%f %f %f (%f %f)",dx,dy,dz,pitch,yaw);
  1369.         c = Cos[(int)pitch];
  1370.         s = Sin[(int)pitch];
  1371.  
  1372.         dyr = dy*c - dz*s;
  1373.         dzr = dz*c + dy*s;
  1374.  
  1375.         dys = dyr;
  1376.         dzs = dzr;
  1377.         c = Cos[(int)yaw];
  1378.         s = Sin[(int)yaw];
  1379.  
  1380.         dxr = dxs*c + dzs*s;
  1381.         dzr = dzs*c - dxs*s;
  1382.         dxs = dxr;
  1383.         dzs = dzr;
  1384.  
  1385.  
  1386.  
  1387.         x +=dxr*dt;
  1388.         y +=dyr*dt;
  1389.         z +=dzr*dt;
  1390.         redx = dxr;
  1391.         redy = dyr;
  1392.         redz = dzr;
  1393.     }
  1394.     else{
  1395.         //Print("other");
  1396.         yaw +=dyaw*dt;
  1397.         pitch +=dpitch*dt;
  1398.         roll +=droll*dt;
  1399.         while(yaw < 0) yaw +=MaxAng;
  1400.         while(pitch < 0) pitch +=MaxAng;
  1401.         while(yaw >= MaxAng) yaw -=MaxAng;
  1402.         while(pitch >= MaxAng) pitch -=MaxAng;
  1403.         while(roll < 0) roll +=MaxAng;
  1404.         while(roll >= MaxAng) roll -=MaxAng;
  1405.  
  1406.         float dxs=dx,dys=dy,dzs=dz;
  1407.  
  1408.         //sprintf(MyS,"%f %f %f (%f %f)",dx,dy,dz,pitch,yaw);
  1409.         c = Cos[(int)pitch];
  1410.         s = Sin[(int)pitch];
  1411.  
  1412.         dyr = dy*c - dz*s;
  1413.         dzr = dz*c + dy*s;
  1414.  
  1415.         dys = dyr;
  1416.         dzs = dzr;
  1417.         c = Cos[(int)yaw];
  1418.         s = Sin[(int)yaw];
  1419.  
  1420.         dxr = dxs*c + dzs*s;
  1421.         dzr = dzs*c - dxs*s;
  1422.         dxs = dxr;
  1423.         dzs = dzr;
  1424.  
  1425.  
  1426.  
  1427.         x +=dxr*dt;
  1428.         y +=dyr*dt;
  1429.         z +=dzr*dt;
  1430.         redx = dxr;
  1431.         redy = dyr;
  1432.         redz = dzr;
  1433.     /*if(x>LevMax || x<0 || z>LevMax || z<0){
  1434.         sprintf(MyS,"St: %f %f %f %f %f %f",s,c,dxs,dzs,yaw/Deg,pitch/Deg);
  1435.         Print(MyS);
  1436.         sprintf(MyS,"Md: %f %f %f",dx,dy,dz);
  1437.         Print(MyS);
  1438.     }*/
  1439.     }
  1440.  
  1441.     if(y>1024) y = 1024;
  1442.     if(y<-256) y = -256;
  1443.     if(flag==1){
  1444.         MatMakeIdent(rotc);
  1445.         MatMakeYRot(roty, yaw);
  1446.         MatMakeXRot(rotx, pitch);
  1447.         MatMakeZRot(rotz, roll);
  1448.         MatMultMat(rotx,rote,rotc);
  1449.         MatMultMat(roty,rote,rotc);
  1450.         MatMultMat(rotz,rote,rotc);
  1451.         Camx = x;
  1452.         Camy = y;
  1453.         Camz = z;
  1454.     }
  1455.     if(flag==2){
  1456.         float rdx,rdy,rdz;
  1457.         dz = -192;
  1458.         dx = 0;
  1459.         dy = 0;
  1460.         GDx=0;
  1461.         GDy=0;
  1462.         //GDs=0;
  1463.         //if(mouseon)
  1464.         MouseRead(mainhwnd);
  1465.         dyaw+=GDx*10;
  1466.         dpitch+=GDy;
  1467.         if(next->die)
  1468.             next=prev;
  1469.         if(movetype != 4){
  1470.             if(dpitch>MaxAng/2)
  1471.                 dpitch -=MaxAng;
  1472.  
  1473.             int tmppitch = dpitch - ipitch;
  1474.  
  1475.             if(tmppitch<-2*Deg){
  1476.                 dpitch+=Deg;
  1477.             }
  1478.             else if(tmppitch>2*Deg){
  1479.                 dpitch-=Deg;
  1480.             }
  1481.  
  1482.             if(dyaw>MaxAng/2)
  1483.                 dyaw -=MaxAng;
  1484.  
  1485.             int tmpyaw = dyaw - iyaw;
  1486.  
  1487.             if(tmpyaw<-2*Deg){
  1488.                 dyaw+=Deg;
  1489.             }
  1490.             else if(tmpyaw>2*Deg){
  1491.                 dyaw-=Deg;
  1492.             }
  1493.         }
  1494.         yaw = next->yaw+dyaw;
  1495.         pitch = next->pitch+dpitch+3*Deg;
  1496.         //roll = next->roll;
  1497.  
  1498.  
  1499.         while(yaw>=MaxAng)
  1500.             yaw -=MaxAng;
  1501.         while(yaw<0)
  1502.             yaw +=MaxAng;
  1503.  
  1504.         while(pitch>=MaxAng)
  1505.             pitch -=MaxAng;
  1506.         while(pitch<0)
  1507.             pitch +=MaxAng;
  1508.  
  1509.         c = Cos[(int)pitch];
  1510.         s = Sin[(int)pitch];
  1511.  
  1512.         rdy = dy*c - dz*s;
  1513.         rdz = dz*c + dy*s;
  1514.         dy = rdy;
  1515.         dz = rdz;
  1516.  
  1517.         c = Cos[(int)yaw];
  1518.         s = Sin[(int)yaw];
  1519.  
  1520.         rdx = dx*c + dz*s;
  1521.         rdz = dz*c - dx*s;
  1522.  
  1523.         dx = rdx;
  1524.         dz = rdz;
  1525.  
  1526.         Camx = x = next->x + dx;
  1527.         Camy = y = next->y + dy;
  1528.         Camz = z = next->z + dz;
  1529.     }
  1530.     if(flag==3){
  1531.         if(next->die)
  1532.             next=prev;
  1533.         x=next->x;
  1534.         y=next->y;
  1535.         z=next->z;
  1536.         yaw = next->yaw;
  1537.         pitch = next->pitch;
  1538.         roll = next->roll;
  1539.         MatMakeIdent(rotc);
  1540.         MatMakeYRot(roty, yaw);
  1541.         MatMakeXRot(rotx, pitch);
  1542.         MatMakeZRot(rotz, roll);
  1543.         MatMultMat(rotz,rote,rotc);
  1544.         MatMultMat(rotx,rote,rotc);
  1545.         MatMultMat(roty,rote,rotc);
  1546.         Camx = x;
  1547.         Camy = y;
  1548.         Camz = z;
  1549.     }
  1550.     collide();
  1551.     return 1;
  1552. }
  1553.  
  1554. void entity_t::setit(int modify, float value){
  1555.     switch(modify){
  1556.         case setflag:
  1557.             flag = value;
  1558.             break;
  1559.         case setuseinput:
  1560.             useinput = value;
  1561.             break;
  1562.         case setyaw:
  1563.             yaw=value;
  1564.             break;
  1565.         case setpitch:
  1566.             pitch=value;
  1567.             break;
  1568.         case setroll:
  1569.             roll=value;
  1570.             break;
  1571.         case setx:
  1572.             x=value;
  1573.             break;
  1574.         case sety:
  1575.             y=value;
  1576.             break;
  1577.         case setz:
  1578.             z=value;
  1579.             break;
  1580.         case setlight:
  1581.             light=value;
  1582.             break;
  1583.         case setrad:
  1584.             rad=value;
  1585.             break;
  1586.         case setdyaw:
  1587.             dyaw=value;
  1588.             break;
  1589.         case setdpitch:
  1590.             dpitch=value;
  1591.             break;
  1592.         case setdroll:
  1593.             droll=value;
  1594.             break;
  1595.         case setmove:
  1596.             movetype=value;
  1597.             break;
  1598.         default:
  1599.             break;
  1600.     }//Switch
  1601. }
  1602. void entity_t::lights(float Red, float Green, float Blue, float Alpha,float hard){
  1603.     lightr = Red;
  1604.     lightg = Green;
  1605.     lightb = Blue;
  1606.     lighta = Alpha;
  1607.     lighth = hard;
  1608.     light = 1;
  1609.  
  1610. }
  1611. void entity_t::PrintStats(){
  1612.  
  1613.     sprintf(MyS,"Camera X: %f,Y: %f,Z: %f,",x,y,z);
  1614.     Print(MyS);
  1615.     sprintf(MyS,"Camera Yaw: %f,Pitch: %f,Roll: %f",yaw,pitch,roll);
  1616.     Print(MyS);
  1617. }
  1618. void entity_t::castlight(entity_t *Other){
  1619.     int tmp,rgb;
  1620.     float dist,dist2,rdx,rdy,rdz,inten,al2=Other->lighta*Other->lighth;
  1621.     al2*=al2;
  1622.     if(Other->light == 0) return;
  1623.     for(tmp=0;tmp<NumVerts;tmp++){
  1624.         rdx = Other->x-rVerts[tmp].x;
  1625.         rdy = Other->y-rVerts[tmp].y;
  1626.         rdz = Other->z-rVerts[tmp].z;
  1627.         dist2 = rdx*rdx+rdy*rdy+rdz*rdz;
  1628.         if(dist2>al2) continue;
  1629.         dist= sqrt(dist2);
  1630.         inten = Other->lighth-dist/Other->lighta;//(dist2/382.5-5*dist/3+255)/255;//((dist2/255-dist+255)/255);
  1631.         lit[tmp].r+=(Other->lightr*inten)/255;
  1632.         lit[tmp].g+=(Other->lightg*inten)/255;
  1633.         lit[tmp].b+=(Other->lightb*inten)/255;
  1634.         if(lit[tmp].r>2) lit[tmp].r = 2;
  1635.         if(lit[tmp].g>2) lit[tmp].g = 2;
  1636.         if(lit[tmp].b>2) lit[tmp].b = 2;
  1637.         if(lit[tmp].r<0) lit[tmp].r = 0;
  1638.         if(lit[tmp].g<0) lit[tmp].g = 0;
  1639.         if(lit[tmp].b<0) lit[tmp].b = 0;
  1640.     }
  1641. }
  1642. entity_t::CameraRender(){
  1643.     float yaw2,pitch2,roll2;
  1644.     yaw2 = MaxAng - yaw;
  1645.     pitch2 = MaxAng - pitch;
  1646.     roll2 = MaxAng - roll;
  1647.     if(yaw2 < 0) yaw2 +=MaxAng;
  1648.     if(pitch2 < 0) pitch2 +=MaxAng;
  1649.     if(roll2 < 0) roll2 +=MaxAng;
  1650.     if(yaw2 >= MaxAng) yaw2 -=MaxAng;
  1651.     if(pitch2 >= MaxAng) pitch2 -=MaxAng;
  1652.     if(roll2 >= MaxAng) roll2 -=MaxAng;
  1653.     MatMakeIdent(rotc);
  1654.     MatMakeYRot(roty, yaw2);
  1655.     MatMakeXRot(rotx, pitch2);
  1656.     MatMakeZRot(rotz, roll2);
  1657.     MatMultMat(rotz,rotc,rotc);
  1658.     MatMultMat(rotx,rotc,rotc);
  1659.     MatMultMat(roty,rotc,rotc);
  1660.  
  1661.     MatMakeIdent(rote);
  1662.     MatMakeYRot(roty, yaw);
  1663.     MatMakeXRot(rotx, pitch);
  1664.     MatMakeZRot(rotz, roll);
  1665.     //MatMultMat(rotx,rote,rote);
  1666.     MatMultMat(roty,rote,rote);
  1667.     //MatMultMat(rotz,rote,rote);
  1668.     int tmp,tmp2;
  1669.  
  1670.     for(tmp = 0;tmp<3;tmp++){
  1671.         FoVTriT[tmp].x = FoVTri[tmp].x;//+gridsep*GridNum/4;
  1672.         FoVTriT[tmp].y = FoVTri[tmp].y;
  1673.         FoVTriT[tmp].z = FoVTri[tmp].z;//+gridsep*GridNum/4;
  1674.         PointMatMult(&FoVTriT[tmp],&FoVTriT[tmp],rote);
  1675.         FoVTriT[tmp].x += Camx;
  1676.         FoVTriT[tmp].y += Camy;
  1677.         FoVTriT[tmp].z += Camz;
  1678.  
  1679.     }
  1680.     //sprintf(MyS,"%f %f %f",FoVTriT[0].x,FoVTriT[0].y,FoVTriT[0].z);
  1681.     //Print(MyS);
  1682.  
  1683.     for(tmp = 0;tmp<3;tmp++){
  1684.         tmp2 = tmp+1;
  1685.         if(tmp2 >2) tmp2 = 0;
  1686.         Tridx[tmp] = -(FoVTriT[tmp].x - FoVTriT[tmp2].x);
  1687.         Tridz[tmp] = FoVTriT[tmp].z - FoVTriT[tmp2].z;
  1688.         //Trim[tmp] = -Tridz[tmp]/Tridx[tmp];
  1689.         Trib[tmp] = Tridx[tmp]*FoVTriT[tmp].z + Tridz[tmp]*FoVTriT[tmp].x;
  1690.     }
  1691. /*    for(tmp = 0;tmp<3;tmp++){
  1692.         FoVTriT[tmp].ooz =
  1693.         FoVTriT[tmp].oow = 1/(FoVTri[tmp].z+1);
  1694.         FoVTriT[tmp].x = Camzoomx*FoVTri[tmp].x*FoVTriT[tmp].ooz+wHWidth+vertex_snapper;
  1695.         FoVTriT[tmp].y = Camzoomy*(FoVTri[tmp].y+.1)*FoVTriT[tmp].ooz+wHHeight+vertex_snapper;
  1696.         FoVTriT[tmp].x -=vertex_snapper;
  1697.         FoVTriT[tmp].y -=vertex_snapper;
  1698.     }
  1699.     FoVTriT[0].a = 255;
  1700.     FoVTriT[1].a = 255;
  1701.     FoVTriT[2].a = 255;
  1702.     guDrawTriangleWithClip(&FoVTriT[0],&FoVTriT[1],&FoVTriT[2]);*/
  1703.     for(tmp = 0;tmp<NumLand;tmp++){
  1704.         //sprintf(MyS,"%i",tmp);
  1705.         //Print(MyS);
  1706.         land[tmp].render(rotc,x,y,z);
  1707.     }
  1708.     return 1;
  1709. }
  1710.  
  1711. //lwo stuff
  1712. short   BigShort (short l)
  1713. {
  1714.     byte    b1,b2;
  1715.  
  1716.     b1 = l&255;
  1717.     b2 = (l>>8)&255;
  1718.  
  1719.     return (b1<<8) + b2;
  1720. }
  1721.  
  1722. short   LittleShort (short l)
  1723. {
  1724.     return l;
  1725. }
  1726.  
  1727.  
  1728. int    BigLong (int l)
  1729. {
  1730.     byte    b1,b2,b3,b4;
  1731.  
  1732.     b1 = l&255;
  1733.     b2 = (l>>8)&255;
  1734.     b3 = (l>>16)&255;
  1735.     b4 = (l>>24)&255;
  1736.  
  1737.     return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
  1738. }
  1739.  
  1740. int    LittleLong (int l)
  1741. {
  1742.     return l;
  1743. }
  1744.  
  1745. float    BigFloat (float l)
  1746. {
  1747.     union {byte b[4]; float f;} in, out;
  1748.  
  1749.     in.f = l;
  1750.     out.b[0] = in.b[3];
  1751.     out.b[1] = in.b[2];
  1752.     out.b[2] = in.b[1];
  1753.     out.b[3] = in.b[0];
  1754.  
  1755.     return out.f;
  1756. }
  1757.  
  1758. float    LittleFloat (float l)
  1759. {
  1760.     return l;
  1761. }
  1762.